const { ListNode, LinkedList } = require('../2. 链表/1. 链表基础/1. 建立线性链表.js')
// 给你链表的头节点head，再给点一个正整数k，k的值小于或等于链表的长度
// 每k个节点一组进行翻转，并返回修改后的链表，如果链表节点总数不是k的整数倍，则将最后剩余的节点保持原有顺序

function reverseKGroup(head, k) {
    let dummyHead = new ListNode(0, head)
    let cur = dummyHead // 待反转区间的上一个节点
    let tail = dummyHead.next // 待反转区间的下一个节点
    let index = 0
    while (tail) {
        index++
        if (index % k === 0) {
            cur = reverse(cur, tail.next)
            tail = cur.next
        } else {
            tail = tail.next
        }
    }
    return dummyHead.next
}

function reverse(head, tail) {
    let pre = head // 待反转区间的上一个节点
    let cur = head.next 
    let first = head.next // 待反转区间的第一个节点，处理完后为尾节点，作为下一个反转的pre节点
    while (cur !== tail) {
        let temp = cur.next
        cur.next = pre
        pre = cur
        cur = temp
    }
    // 反转结束后，之前的首节点变为尾节点，尾节点变为首节点
    head.next = pre
    first.next = tail
    return first
}

let head = [1, 2, 3, 4, 5,6,7], k = 3
let node = new LinkedList(head)
let res = reverseKGroup(node.head, k)
console.log(res);